Springboot之 Mybatis 多数据源实现 您所在的位置:网站首页 springboot mybatis insert Springboot之 Mybatis 多数据源实现

Springboot之 Mybatis 多数据源实现

#Springboot之 Mybatis 多数据源实现| 来源: 网络整理| 查看: 265

Springboot之 Mybatis 多数据源实现 精选 原创

BUG弄潮儿 2023-05-03 11:36:47 ©著作权

文章标签 spring sql 多数据源 文章分类 Java 后端开发

©著作权归作者所有:来自51CTO博客作者BUG弄潮儿的原创作品,请联系作者获取转载授权,否则将追究法律责任 简介

上篇讲解了 JPA 多数据源实现;这篇讲解一下 Mybatis 多数据源实现 。主要采用将不同数据库的 Mapper 接口分别存放到不同的 package,Spring 去扫描不同的包,注入不同的数据源来实现多数据源。原理跟 JPA 多数据源实现基本一致。

创建 mybatis-multip-datasource 项目数据库脚本参考:pom.xml文件引入如下依赖 4.0.0 com.olive mybatis-multip-datasource 0.0.1-SNAPSHOT jar jpa-multip-datasource http://maven.apache.org org.springframework.boot spring-boot-starter-parent 2.5.14 UTF-8 8 8 org.springframework.boot spring-boot-starter-test test org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.3 mysql mysql-connector-java org.projectlombok lombok org.springframework.boot spring-boot-starter-web 配置两个数据源

分别为第一个主数据源(primary),第二数据源(second),具体配置如下:

# 基本配置 server: port: 8080 # 数据库 spring: datasource: primary: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true username: root password: root second: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/crm72?characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true username: root password: root jackson: serialization: indent-output: true配置数据源

DataSourceConfig配置

package com.olive.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; /** * @Description: 数据源配置 */ @Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") @Primary public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondDataSource") @Qualifier("secondDataSource") @ConfigurationProperties(prefix = "spring.datasource.second") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } }

PrimaryConfig数据源

/** * @Description: 主数据源配置 */ @Configuration @MapperScan(basePackages = "com.olive.mapper.primary", sqlSessionTemplateRef = "primarySqlSessionTemplate") public class PrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Bean(name = "primarySqlSessionFactory") @Primary public SqlSessionFactory primarySqlSessionFacotory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(primaryDataSource); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/primary/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name = "primaryTransactionManager") @Primary public DataSourceTransactionManager primaryTransactionManager() { return new DataSourceTransactionManager(primaryDataSource); } @Bean(name = "primarySqlSessionTemplate") @Primary public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }

SecondConfig数据源

/** * @Description: 主数据源配置 */ @Configuration @MapperScan(basePackages = "com.olive.mapper.second", sqlSessionTemplateRef = "secondSqlSessionTemplate") public class SecondConfig { @Autowired @Qualifier("secondDataSource") private DataSource secondDataSource; @Bean(name = "secondSqlSessionFactory") public SqlSessionFactory secondSqlSessionFacotory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(secondDataSource); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/second/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name = "secondTransactionManager") public DataSourceTransactionManager secondTransactionManager() { return new DataSourceTransactionManager(secondDataSource); } @Bean(name = "secondSqlSessionTemplate") public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }创建学生与老师实体类

Student实体类

package com.olive.entity.primary; import java.io.Serializable; import lombok.Data; @Data public class StudentDO implements Serializable{ private Long id; private String name; private int sex; private String grade; }

Teacher实体类

package com.olive.entity.second; import java.io.Serializable; import lombok.Data; @Data public class TeacherDO implements Serializable { private Long id; private String name; private int sex; private String office; }数据库持久类

StudentMapper类

package com.olive.mapper.primary; import com.olive.entity.primary.StudentDO; import org.apache.ibatis.annotations.Param; public interface StudentMapper { int save(@Param("studentDO") StudentDO studentDO); }

TeacherMapper类

package com.olive.mapper.second; import com.olive.entity.second.TeacherDO; import org.apache.ibatis.annotations.Param; public interface TeacherMapper { int save(@Param("teacherDO") TeacherDO teacherDO); }Mybatis xml映射

StudentMapper.xml

INSERT INTO t_student (user_name, sex, grade) VALUES (#{studentDO.name}, #{studentDO.sex}, #{studentDO.grade});

TeacherMapper.xml

INSERT INTO t_teacher ( user_name, sex, office) VALUES (#{teacherDO.name}, #{teacherDO.sex}, #{teacherDO.office});

主要注意这两个xml文件需要放到不同的目录,如下图

Springboot之 Mybatis 多数据源实现_sql

创建springboot引导类package com.olive; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } }测试package com.olive; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import com.olive.entity.primary.StudentDO; import com.olive.entity.second.TeacherDO; import com.olive.mapper.primary.StudentMapper; import com.olive.mapper.second.TeacherMapper; @SpringBootTest public class MybatisTest { @Autowired StudentMapper studentMapper; @Autowired TeacherMapper teacherMapper; @Test public void userSave() { StudentDO studentDO = new StudentDO(); studentDO.setName("BUG弄潮儿"); studentDO.setSex(1); studentDO.setGrade("一年级"); studentMapper.save(studentDO); TeacherDO teacherDO = new TeacherDO(); teacherDO.setName("Java乐园"); teacherDO.setSex(2); teacherDO.setOffice("语文"); teacherMapper.save(teacherDO); } } 打赏 收藏 评论 分享 举报

上一篇:基于RabbitMQ的MQTT实现

下一篇:Springboot 之 JDBC 多数据源实现



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有